package cn.zyl.demo.common.tools;

import cn.zyl.demo.common.beans.TreeNode;
import cn.zyl.demo.common.constant.CommonConstant;

import java.io.*;
import java.util.List;
import java.util.Map;
import java.util.Set;

/** ObjectTool工具类说明:object 工具类
 * @author wsz
 * @date 2020-08-05
 * @version v1.0
 */
public class ObjectTool {
    private ObjectTool(){throw new IllegalAccessError("ObjectTool");}
    /**
     * 判断是否为null，如果为null返回默认值，不为null返回原值
     * @param val 需要判断的值
     * @param def 默认值
     * @param <T> 值的类型
     * @return 值
     */
    public static <T> T isNullByDef(T val,T def){
        return null == val ? def : val;
    }
    /**
     * object转字符串，为null返回空字符串
     * @param val 需要转的对象，需要实现toString方法
     * @return 字符串
     */
    public static String toStr(Object val){
        return null == val ? "" :val.toString();
    }
    /**
     * 判断对象是否为null
     * @param o 待验证的对象
     * @return null true;反之 false
     */
    public static <T> boolean isNull(T o) {
        return null == o;
    }
    /**
     * 判断对象是否非null
     * @param o 待验证的对象
     * @return null false;反之 true
     */
    public static <T> boolean isNotNull(T o) {
        return null != o;
    }
    /**
     * 判断集合是否非空
     * @param list 待验证的对象
     * @return 是否为空
     */
    public static boolean isEmpty(List<?> list) {
        return null == list || list.isEmpty();
    }
    /**
     * 判断集合是否非空
     * @param set 待验证的Set
     * @return 是否为空
     */
    public static boolean isEmpty(Set<?> set) {
        return null == set || set.isEmpty();
    }
    /**
     * 判断集合是否为空
     * @param map 待验证的Map
     * @return 是否为空
     */
    public static boolean isEmpty(Map<?, ?> map) {
        return null == map || map.isEmpty();
    }
    /**
     * 判断Long是否为空
     * @param lg 待验证的Long
     * @return 是否为空
     */
    public static boolean isEmpty(Long lg) {
        return null == lg || lg == 0;
    }
    /**
     * 判断Integer是否为空
     * @param it 待验证的Integer
     * @return 是否为空
     */
    public static boolean isEmpty(Integer it) {
        return null == it || it == 0;
    }
    /**
     * 判断文件是否为空,或者不存在
     * @param file 待验证的File
     * @return 是否为空,或者不存在
     */
    public static boolean isEmpty(File file) {
        return null == file || !file.exists();
    }
    /**
     * 判断数组是否为空
     * @param objects 待验证的数组
     * @return 是否为空
     */
    public static boolean isNull(Object[] objects) {
        return null == objects || objects.length == 0;
    }
    /**
     * 克隆对象
     * @param o 待克隆的对象,必须实现Serializable
     * @return 克隆的新对象
     */
    @SuppressWarnings("unchecked")
    public static <T> T clone(T o) {
        if (null == o) { return null; }
        if(!(o instanceof Serializable)){return null;}
        // 将对象序列化后写在流里,因为写在流里面的对象是一份拷贝,原对象仍然在JVM里
        try (
                ByteArrayOutputStream bos = new ByteArrayOutputStream();
                ObjectOutputStream oos = new ObjectOutputStream(bos);
                ){
            oos.writeObject(o);
            ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bos.toByteArray()));
            return (T)ois.readObject();
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }
    public static void main(String[] args) {
        System.out.println(isNullByDef(null, 99));
        System.out.println(isNullByDef(null, "9-9"));
    }
}